import cv2 as cv
import numpy as np


def measure_object(image):
    gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)
    cv.imshow("binary_image", binary)
    outimage, contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for i, contour in enumerate(contours):
        area = cv.contourArea(contour)  # 轮廓的面积
        x, y, w, h = cv.boundingRect(contour)  # 轮廓的外接矩形面积（轮廓的垂直边界最小矩形，矩形是与图像上下边界平行的）
        # （x,y）是矩阵左上点的坐标，w和h分别是矩阵的宽高，则矩阵右下点的坐标是（x+w,y+h）
        mm = cv.moments(contour)  # 求原点矩
        cx = mm['m10']/(mm['m00']+0.01)  # 求质心的坐标x  # 分母加0.01是因为有些目标的灰度均值为0，但是分母不能为0，因此加上一个很小的数值既可以避免分母为0，又对整体结果影响较小
        cy = mm['m01']/(mm['m00']+0.01)  # 求质心的坐标y
        cv.circle(image, (np.int(cx), np.int(cy)), 3, (0, 255, 0), -1)  # 第三个参数是半径，第五个参数是线条的粗细，如果为负数则表示填充
        cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
    cv.imshow("specie", image)


src = cv.imread('imgs/test001.png')
cv.imshow("input_image", src)
measure_object(src)
cv.waitKey(0)
cv.destroyAllWindows()
